package com.zx.crowdfunding.mvc.handler;

import javax.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import com.github.pagehelper.PageInfo;
import com.zx.crowdfunding.constant.CrowdFundingConstant;
import com.zx.crowdfunding.entity.Admin;
import com.zx.crowdfunding.service.api.AdminService;

/**
 * 管理员	- Handler
 * @author 郑雪
 * @date 2021-12-08
 */
@Controller
public class AdminHandler {
	
	/**
	 * 管理员Service接口
	 */
	@Autowired
	private AdminService adminService;
	
	/**
	 * 管理员登录
	 * @param loginAcct 登录账号
	 * @param userPswd 登录密码
	 * @param session 当前会话
	 * @return 重定向到后台主页面
	 */
	@RequestMapping("/admin/do/login.html")
	public String doLogin(
				@RequestParam("loginAcct") String loginAcct, 
				@RequestParam("userPswd") String userPswd, 
				HttpSession session
			){
		
		// 调用Service方法执行登录检查
		// 这个方法如果能够返回admin对象说明登录成功，如果账号、密码不正确则会抛出异常
		Admin admin = adminService.getAdminByLoginAcct(loginAcct, userPswd);
		
		// 将登录成功返回的admin对象存入Session域
		session.setAttribute(CrowdFundingConstant.ATTR_NAME_LOGIN_ADMIN, admin);
		
		// 重定向到后台主页面
		return "redirect:/admin/to/main/page.html";
	}
	
	/**
	 * 管理员退出登录
	 * @param session 当前会话
	 * @return 重定向到登录页
	 */
	@RequestMapping("/admin/do/logout.html")
	public String doLogout(HttpSession session){
		
		// 强制Session失效
		session.invalidate();
		
		// 重定向到后台登录页面
		return "redirect:/admin/to/login/page.html";
	}
	
	/**
	 * 管理员获取分页数据
	 * @param keyword 查询的关键字，默认为""
	 * @param pageNum 分页的页码，默认为1
	 * @param pageSize 分页的大小，默认为5
	 * @param modelMap 返回时存入请求域的参数值
	 * @return 跳转到管理员分页列表页
	 */
	@RequestMapping("/admin/get/page.html")
	public String getPageInfo(
				@RequestParam(value="keyword", defaultValue="") String keyword, 
				@RequestParam(value="pageNum", defaultValue="1") Integer pageNum, 
				@RequestParam(value="pageSize", defaultValue="5") Integer pageSize, 
				ModelMap modelMap
			){
		
		// 调用Service方法获取PageInfo对象
		PageInfo<Admin> pageInfo = adminService.getPageInfo(keyword, pageNum, pageSize);
		
		// 将PageInfo对象存入模型
		modelMap.addAttribute(CrowdFundingConstant.ATTR_NAME_PAGE_INFO, pageInfo);
		
		// 跳转到管理员分页列表页
		return "admin-page";
	}
	
	/**
	 * 删除管理员
	 * @param id 管理员id
	 * @param pageNum 当前页页码
	 * @param keyword 当前查询的关键字
	 * @return 重定向到管理员分页列表页
	 */
	@RequestMapping("/admin/remove/{id}/{pageNum}/{keyword}.html")
	public String remove(
				@PathVariable("id") Integer id, 
				@PathVariable("pageNum") Integer pageNum, 
				@PathVariable("keyword") String keyword, 
				RedirectAttributes redirectAttributes
			){
		
		// 执行删除
		adminService.removeAdmin(id);
		
		// redirect参数
		redirectAttributes.addAttribute("pageNum", pageNum);
		redirectAttributes.addAttribute("keyword", keyword);
		
		// 跳转到管理员分页列表页
		return "redirect:/admin/get/page.html";
	}
	
	/**
	 * 添加管理员
	 * @param admin 管理员对象
	 * @return 重定向到管理员分页列表页
	 */
	@RequestMapping("/admin/save.html")
	public String save(Admin admin){
		
		// 执行添加
		adminService.saveAdmin(admin);
		
		// 重定向到管理员分页列表页
		return "redirect:/admin/get/page.html?pageNum="+Integer.MAX_VALUE;
	}
	
	/**
	 * 跳转到修改管理员页面
	 * @param id 管理员id
	 * @param pageNum 当前页页码
	 * @param keyword 当前查询的关键字
	 * @param modelMap 视图携带参数
	 * @return 跳转到管理员修改页面
	 */
	@RequestMapping("/admin/to/edit/page.html")
	public String toEditPage(
				@RequestParam("id") Integer id, 
				@RequestParam("pageNum") Integer pageNum, 
				@RequestParam("keyword") String keyword, 
				ModelMap modelMap
			){
		
		// 1.根据id查询Admin对象
		Admin admin = adminService.getAdminById(id);
		
		// 2.Admin对象存入模型
		modelMap.addAttribute("admin", admin);
		
		// 3.跳转到修改页面
		return "admin-edit";
	}
	
	/**
	 * 修改管理员
	 * @param pageNum 当前页页码
	 * @param keyword 当前查询的关键字
	 * @param admin 管理员对象
	 * @return 重定向到管理员分页列表页
	 */
	@RequestMapping("/admin/edit.html")
	public String edit(
				@RequestParam("pageNum") Integer pageNum, 
				@RequestParam("keyword") String keyword,
				Admin admin,
				RedirectAttributes redirectAttributes
			){
		
		// 执行修改
		adminService.editAdmin(admin);
		
		// redirect参数
		redirectAttributes.addAttribute("pageNum", pageNum);
		redirectAttributes.addAttribute("keyword", keyword);
		
		// 重定向到管理员分页列表页
		return "redirect:/admin/get/page.html";
	}

}
